From 35a9acc89dc7f7dc2f6e080abebcc3416be420db Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.com>
Date: Thu, 16 Dec 2021 16:25:00 +0000
Subject: [PATCH] staging/bcm2835-isp: Fix cleanup after init fail

bcm2835_isp_remove is called on an initialisation failure, but at that
point the drvdata hasn't been set. This causes a crash when e.g. using
the cutdown firmware (gpu_mem=16).

Move platform_set_drvdata before the instance probing loop to avoid the
problem.

See: https://github.com/raspberrypi/linux/issues/4774

Signed-off-by: Phil Elwell <phil@raspberrypi.com>
---
 drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--- a/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
+++ b/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
@@ -1776,6 +1776,8 @@ static int bcm2835_isp_probe(struct plat
 	if (!bcm2835_isp_instances)
 		return -ENOMEM;
 
+	platform_set_drvdata(pdev, bcm2835_isp_instances);
+
 	for (i = 0; i < BCM2835_ISP_NUM_INSTANCES; i++) {
 		ret = bcm2835_isp_probe_instance(pdev,
 						 &bcm2835_isp_instances[i], i);
@@ -1783,7 +1785,6 @@ static int bcm2835_isp_probe(struct plat
 			goto error;
 	}
 
-	platform_set_drvdata(pdev, bcm2835_isp_instances);
 	dev_info(&pdev->dev, "Loaded V4L2 %s\n", BCM2835_ISP_NAME);
 	return 0;
 
